home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-09-17 | 18.6 KB | 609 lines | [TEXT/MPS ] |
- //========================================================================================
- //
- // File: SLFileOp.cpp
- // Release Version: $ ODF 2 $
- //
- // Copyright: (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
- //
- //========================================================================================
-
- #include "FWOS.hpp"
-
- #ifndef SLFILEOP_H
- #include "SLFileOp.h"
- #endif
-
- #ifndef SLODFSTR_K
- #include "SLODFStr.k"
- #endif
-
- #ifndef FWCFMRES_H
- #include "FWCFMRes.h"
- #endif
-
- #ifndef FWRESACC_H
- #include "FWResAcc.h"
- #endif
-
- #ifndef FWRESTYP_H
- #include "FWResTyp.h"
- #endif
-
- // ----- Foundation Includes -----
-
- #ifndef FWSOMENV_H
- #include "FWSOMEnv.h"
- #endif
-
- #ifndef FWBNDSTR_H
- #include <FWBndStr.h>
- #endif
-
- #ifndef FWMEMMGR_H
- #include <FWMemMgr.h>
- #endif
-
- //----- Windows includes -----
-
- #if defined(FW_BUILD_WIN) && !defined(__STDLIB_H)
- #include <stdlib.h>
- #endif
-
- #if defined(FW_BUILD_WIN) && !defined(__WINDOWS_H)
- #include <windows.h>
- #endif
-
- #if defined(FW_BUILD_WIN) && !defined(__COMMDLG_H)
- #include <commdlg.h>
- #endif
-
- #if defined(FW_BUILD_WIN) && !defined(IO_H)
- #include "io.h"
- #endif
-
- //----- Macintosh includes -----
-
- // for DisposeRoutineDescriptor
- #if defined(FW_BUILD_MAC) && !defined(__MIXEDMODE__)
- #include <MixedMode.h>
- #endif
-
- //========================================================================================
- // Runtime Informations
- //========================================================================================
-
- #ifdef FW_BUILD_MAC
- #pragma segment fwosmisc
- #endif
-
- //----------------------------------------------------------------------------------------
- // FW_ChooseFileToOpen
- //----------------------------------------------------------------------------------------
-
- FW_OFileSpecification* SL_API FW_ChooseFileToOpen(FW_HOpenFileParameters openFileParam)
- {
- FW_OFileSpecification* fileSpec = NULL;
-
- FW_TRY
- {
- #ifdef FW_BUILD_MAC
- StandardFileReply reply;
- // pascal void StandardGetFile(FileFilterUPP fileFilter, short numTypes, SFTypeList typeList, StandardFileReply *reply)
- FileFilterUPP fileFilter = NewFileFilterProc(FW_OpenFileParameters_MacGetFilterProc(openFileParam));
- ::StandardGetFile(fileFilter,
- FW_OpenFileParameters_MacCountTypes(openFileParam),
- FW_OpenFileParameters_MacGetTypes(openFileParam),
- &reply);
- DisposeRoutineDescriptor((UniversalProcPtr)fileFilter);
-
- if (reply.sfGood)
- {
- FW_SOMEnvironment ev;
-
- fileSpec = new FW_OFileSpecification;
- fileSpec->AssignFileSpec(ev, &reply.sfFile);
- }
- #endif
-
- #ifdef FW_BUILD_WIN
- OPENFILENAME ofn;
- char fullFileName[_MAX_PATH];
-
- ::memset(&ofn, 0, sizeof(OPENFILENAME));
-
- fullFileName[0] = 0;
-
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = FW_OpenFileParameters_WinGetOwnerWindow(openFileParam);
- ofn.lpstrFilter = FW_OpenFileParameters_WinGetFilterString(openFileParam);
- ofn.lpstrFile = fullFileName;
- ofn.nMaxFile = _MAX_PATH; // size of fullFileName buffer
- ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
- ofn.lpstrDefExt = FW_OpenFileParameters_WinGetDefaultExt(openFileParam);
-
- if (::GetOpenFileName(&ofn))
- {
- FW_SOMEnvironment ev;
- FW_CString255 name(fullFileName);
-
- fileSpec = new FW_OFileSpecification;
- fileSpec->InitFromFileName(ev, name);
- }
- #endif
- }
- FW_CATCH_BEGIN
- FW_CATCH_EVERYTHING()
- {
- if (fileSpec != 0)
- {
- delete fileSpec;
- fileSpec = 0;
- }
- }
- FW_CATCH_END
-
- return fileSpec;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_ChooseFileToSave
- //----------------------------------------------------------------------------------------
-
- FW_OFileSpecification* SL_API FW_ChooseFileToSave(FW_HSaveFileParameters saveFileParam)
- {
- FW_OFileSpecification* fileSpec = NULL;
-
- FW_TRY
- {
- #ifdef FW_BUILD_MAC
- // pascal void StandardPutFile(ConstStr255Param prompt, ConstStr255Param defaultName, StandardFileReply *reply)
- FW_CString str;
-
- Str255 defaultName;
- str = FW_SaveFileParameters_MacGetDefaultName(saveFileParam);
- str.ExportPascal(defaultName);
-
- Str255 savePrompt;
- str = FW_SaveFileParameters_MacGetSavePrompt(saveFileParam);
- str.ExportPascal(savePrompt);
-
- StandardFileReply reply;
- ::StandardPutFile(savePrompt, defaultName, &reply);
- if (reply.sfGood)
- {
- FW_SOMEnvironment ev;
-
- fileSpec = new FW_OFileSpecification;
- fileSpec->AssignFileSpec(ev, &reply.sfFile);
- }
- #endif
-
- #ifdef FW_BUILD_WIN
- OPENFILENAME ofn;
- ::memset(&ofn, 0, sizeof(OPENFILENAME));
-
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = FW_SaveFileParameters_WinGetOwnerWindow(saveFileParam);
- ofn.lpstrFilter = FW_SaveFileParameters_WinGetFilterString(saveFileParam);
- ofn.lpstrFile = FW_SaveFileParameters_WinGetDefaultName(saveFileParam);
- ofn.nMaxFile = _MAX_PATH;
- ofn.lpstrDefExt = FW_SaveFileParameters_WinGetDefaultExt(saveFileParam);
- ofn.Flags = OFN_OVERWRITEPROMPT;
-
- if (::GetSaveFileName(&ofn))
- {
- FW_SOMEnvironment ev;
- FW_CString255 fileName(FW_SaveFileParameters_WinGetDefaultName(saveFileParam));
-
- fileSpec = new FW_OFileSpecification;
- fileSpec->InitFromFileName(ev, fileName);
- }
- #endif
- }
- FW_CATCH_BEGIN
- FW_CATCH_EVERYTHING()
- {
- if (fileSpec != 0)
- {
- delete fileSpec;
- fileSpec = 0;
- }
- }
- FW_CATCH_END
-
- return fileSpec;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_OpenFileParameters_Construct
- //----------------------------------------------------------------------------------------
-
- FW_PlatformError SL_API FW_OpenFileParameters_Construct(FW_HOpenFileParameters parameters)
- {
- #ifdef FW_BUILD_MAC
- parameters->fNumTypes = -1;
- parameters->fFileFilterProc = NULL;
- #endif
- #ifdef FW_BUILD_WIN
- parameters->fOwnerWindow = NULL;
- parameters->fFilterString = NULL;
- parameters->fDefaultExt[0] = 0;
- #endif
- parameters->fReserved = NULL;
-
- return FW_xNoError;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_OpenFileParameters_Destruct
- //----------------------------------------------------------------------------------------
-
- FW_PlatformError SL_API FW_OpenFileParameters_Destruct(FW_HOpenFileParameters parameters)
- {
- FW_UNUSED(parameters);
- #ifdef FW_BUILD_WIN
- if (parameters->fFilterString)
- FW_CMemoryManager::FreeBlock(parameters->fFilterString);
- #endif
- return FW_xNoError;
- }
-
- #ifdef FW_BUILD_MAC
- //----------------------------------------------------------------------------------------
- // FW_OpenFileParameters_MacSet
- //----------------------------------------------------------------------------------------
-
- FW_PlatformError SL_API FW_OpenFileParameters_MacSet(FW_HOpenFileParameters parameters,
- short numTypes,
- OSType* fileType,
- FileFilterProcPtr fileFilterProc)
- {
- FW_ASSERT(numTypes >= -1);
-
- parameters->fNumTypes = numTypes;
- for (short i = 0; i<numTypes; i++)
- parameters->fTypes[i] = fileType[i];
-
- parameters->fFileFilterProc = fileFilterProc;
-
- return FW_xNoError;
- }
- #endif
-
- #ifdef FW_BUILD_WIN
- //----------------------------------------------------------------------------------------
- // FW_OpenFileParameters_WinInit
- //----------------------------------------------------------------------------------------
-
- FW_PlatformError SL_API FW_OpenFileParameters_WinInit(FW_HOpenFileParameters parameters,
- FW_HString filterString,
- FW_HString defaultExt,
- HWND ownerWindow)
- {
- if (ownerWindow == NULL)
- parameters->fOwnerWindow = NULL;
- else
- parameters->fOwnerWindow = ownerWindow; // [KVV] Temporary code! ->GetXMPWindow()->GetPlatformWindow();
-
- return FW_OpenFileParameters_WinSet(parameters, filterString, defaultExt);
- }
- #endif
-
- #ifdef FW_BUILD_WIN
- //----------------------------------------------------------------------------------------
- // FW_OpenFileParameters_WinSet
- //----------------------------------------------------------------------------------------
-
- FW_PlatformError SL_API FW_OpenFileParameters_WinSet(FW_HOpenFileParameters parameters,
- FW_HString filterStringParam,
- FW_HString defaultExtParam)
- {
- FW_TRY
- {
- FW_CString filterString(filterStringParam);
- FW_CString defaultExt(defaultExtParam);
-
- if (defaultExt.GetByteLength() < 4)
- defaultExt.ExportCString(parameters->fDefaultExt);
-
- long length = filterString.GetByteLength();
- if (length == 0)
- return FW_xUnknownError;
-
- // Allocate memory to hold the filter strings
- parameters->fFilterString = (char*)FW_CMemoryManager::AllocateBlock(length+1); // add room for 0-terminator
- filterString.ExportCString(parameters->fFilterString);
-
- char chReplace = parameters->fFilterString[length-1]; // final char should be "|" or other separator
- // replace separator characters with 0's, dividing filter into individual strings
- for (short i = 0; parameters->fFilterString[i] != '\0'; i++)
- if (parameters->fFilterString[i] == chReplace)
- parameters->fFilterString[i] = '\0';
- }
- FW_CATCH_BEGIN
- FW_CATCH_REFERENCE(FW_XException, exception)
- {
- return exception.GetPlatformError();
- }
- FW_CATCH_EVERYTHING()
- {
- return FW_xUnknownError;
- }
- FW_CATCH_END
- return FW_xNoError;
- }
- #endif
-
- //----------------------------------------------------------------------------------------
- // FW_SaveFileParameters_Construct
- //----------------------------------------------------------------------------------------
-
- FW_PlatformError SL_API FW_SaveFileParameters_Construct(FW_HSaveFileParameters parameters)
- {
- #ifdef FW_BUILD_MAC
- FW_TRY
- {
- // The default name and save prompt are FW_HStrings. This idiom, courtesy of
- // Jim Lloyd, acquires the FW_HString for the duration of our struct.
- FW_SOMEnvironment ev;
- FW_CString savePrompt;
- FW_PSharedLibraryResourceFile resFile(ev);
- ::FW_LoadStringByID(ev, resFile, FW_kODFStrings, FW_kMultiStringRes, FW_kSaveFileString, savePrompt);
-
- parameters->fSavePrompt = savePrompt;
- FW_PrivString_Acquire(parameters->fSavePrompt);
-
- FW_CString defaultName("");
- parameters->fDefaultName = defaultName;
- FW_PrivString_Acquire(parameters->fDefaultName);
- }
- FW_CATCH_BEGIN
- FW_CATCH_REFERENCE(FW_XException, exception)
- {
- return exception.GetPlatformError();
- }
- FW_CATCH_EVERYTHING()
- {
- return FW_xUnknownError;
- }
- FW_CATCH_END
- #endif
- #ifdef FW_BUILD_WIN
- parameters->fOwnerWindow = NULL;
- parameters->fFilterString = NULL;
- parameters->fDefaultExt[0] = 0;
- parameters->fDefaultName = NULL;
- #endif
- return FW_xNoError;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_SaveFileParameters_Destruct
- //----------------------------------------------------------------------------------------
- FW_PlatformError SL_API FW_SaveFileParameters_Destruct(FW_HSaveFileParameters parameters)
- {
- // No try block necessary - Do not throw
- #ifdef FW_BUILD_MAC
- FW_PrivString_Release(parameters->fSavePrompt);
- FW_PrivString_Release(parameters->fDefaultName);
- #endif
- #ifdef FW_BUILD_WIN
- FW_CMemoryManager::FreeBlock(parameters->fFilterString);
- FW_CMemoryManager::FreeBlock(parameters->fDefaultName);
- #endif
- return FW_xNoError;
- }
-
- #ifdef FW_BUILD_MAC
- //----------------------------------------------------------------------------------------
- // FW_SaveFileParameters_MacInit
- //----------------------------------------------------------------------------------------
- FW_PlatformError SL_API FW_SaveFileParameters_MacInit(FW_HSaveFileParameters parameters,
- FW_HString savePrompt,
- FW_HString defaultName)
- {
- // No try block necessary - Do not throw
- FW_PrivString_Acquire(savePrompt);
- FW_PrivString_Release(parameters->fSavePrompt);
- parameters->fSavePrompt = savePrompt;
-
- FW_PrivString_Acquire(defaultName);
- FW_PrivString_Release(parameters->fDefaultName);
- parameters->fDefaultName = defaultName;
- return FW_xNoError;
- }
- #endif
-
- #ifdef FW_BUILD_WIN
- //----------------------------------------------------------------------------------------
- // FW_SaveFileParameters_WinInit
- //----------------------------------------------------------------------------------------
- FW_PlatformError SL_API FW_SaveFileParameters_WinInit(FW_HSaveFileParameters parameters,
- FW_HString filterString,
- FW_HString defaultExt,
- FW_HString defaultName,
- HWND ownerWindow)
- {
- if (ownerWindow == NULL)
- parameters->fOwnerWindow = NULL;
- else
- parameters->fOwnerWindow = ownerWindow; // [KVV] Temporary code! ->GetXMPWindow()->GetPlatformWindow();
-
- return FW_SaveFileParameters_WinSet(parameters, filterString, defaultExt, defaultName);
- }
- #endif
-
- #ifdef FW_BUILD_WIN
- //----------------------------------------------------------------------------------------
- // FW_SaveFileParameters_WinSet
- //----------------------------------------------------------------------------------------
- FW_PlatformError SL_API FW_SaveFileParameters_WinSet(FW_HSaveFileParameters parameters,
- FW_HString filterStringParam,
- FW_HString defaultExtParam,
- FW_HString defaultNameParam)
- {
- FW_TRY
- {
- FW_CString filterString(filterStringParam);
- FW_CString defaultExt(defaultExtParam);
- FW_CString defaultName(defaultNameParam);
-
- if (defaultExt.GetByteLength() < 4)
- defaultExt.ExportCString(parameters->fDefaultExt);
-
- // Allocate memory to hold the default name
- long length = defaultName.GetByteLength();
- parameters->fDefaultName = (char*)FW_CMemoryManager::AllocateBlock(length+1); // add room for 0-terminator
- defaultName.ExportCString(parameters->fDefaultName);
-
- // Allocate memory to hold the filter strings
- length = filterString.GetByteLength();
- parameters->fFilterString = (char*)FW_CMemoryManager::AllocateBlock(length+1); // add room for 0-terminator
- filterString.ExportCString(parameters->fFilterString);
-
- if (length != 0)
- {
- // Divide filter string into individual strings
- char chReplace = parameters->fFilterString[length-1]; // final char should be "|" or other separator
- for (short i = 0; parameters->fFilterString[i] != '\0'; i++) // replace separator characters with 0's
- if (parameters->fFilterString[i] == chReplace)
- parameters->fFilterString[i] = '\0';
- }
- }
- FW_CATCH_BEGIN
- FW_CATCH_REFERENCE(FW_XException, exception)
- {
- return exception.GetPlatformError();
- }
- FW_CATCH_EVERYTHING()
- {
- return FW_xUnknownError;
- }
- FW_CATCH_END
- return FW_xNoError;
- }
- #endif
-
-
- #ifdef FW_BUILD_MAC
- //----------------------------------------------------------------------------------------
- // FW_OpenFileParameters_MacCountTypes
- //----------------------------------------------------------------------------------------
- short SL_API FW_OpenFileParameters_MacCountTypes(FW_HOpenFileParameters parameters)
- {
- return parameters->fNumTypes;
- }
- #endif
-
- #ifdef FW_BUILD_MAC
- //----------------------------------------------------------------------------------------
- // FW_OpenFileParameters_MacGetFilterProc
- //----------------------------------------------------------------------------------------
- FileFilterProcPtr SL_API FW_OpenFileParameters_MacGetFilterProc(FW_HOpenFileParameters parameters)
- {
- return parameters->fFileFilterProc;
- }
- #endif
-
- #ifdef FW_BUILD_MAC
- //----------------------------------------------------------------------------------------
- // FW_OpenFileParameters_MacGetTypes
- //----------------------------------------------------------------------------------------
- OSType* SL_API FW_OpenFileParameters_MacGetTypes(FW_HOpenFileParameters parameters)
- {
- return parameters->fNumTypes == -1 ? NULL : parameters->fTypes;
- }
- #endif
-
- #ifdef FW_BUILD_WIN
- //----------------------------------------------------------------------------------------
- // FW_OpenFileParameters_WinGetFilterString
- //----------------------------------------------------------------------------------------
- char* SL_API FW_OpenFileParameters_WinGetFilterString(FW_HOpenFileParameters parameters)
- {
- return parameters->fFilterString;
- }
- #endif
-
- #ifdef FW_BUILD_WIN
- //----------------------------------------------------------------------------------------
- // FW_OpenFileParameters_WinGetDefaultExt
- //----------------------------------------------------------------------------------------
- char* SL_API FW_OpenFileParameters_WinGetDefaultExt(FW_HOpenFileParameters parameters)
- {
- return parameters->fDefaultExt;
- }
- #endif
-
- #ifdef FW_BUILD_WIN
- //----------------------------------------------------------------------------------------
- // FW_OpenFileParameters_WinGetOwnerWindow
- //----------------------------------------------------------------------------------------
- HWND SL_API FW_OpenFileParameters_WinGetOwnerWindow(FW_HOpenFileParameters parameters)
- {
- return parameters->fOwnerWindow;
- }
- #endif
-
- #ifdef FW_BUILD_MAC
- //----------------------------------------------------------------------------------------
- // FW_SaveFileParameters_MacGetSavePrompt
- //----------------------------------------------------------------------------------------
- FW_HString SL_API FW_SaveFileParameters_MacGetSavePrompt(FW_HSaveFileParameters parameters)
- {
- // No try block necessary - Do not throw
- return parameters->fSavePrompt;
- }
- #endif
-
- #ifdef FW_BUILD_MAC
- //----------------------------------------------------------------------------------------
- // FW_SaveFileParameters_MacGetDefaultName
- //----------------------------------------------------------------------------------------
- FW_HString SL_API FW_SaveFileParameters_MacGetDefaultName(FW_HSaveFileParameters parameters)
- {
- // No try block necessary - Do not throw
- return parameters->fDefaultName;
- }
- #endif
-
- #ifdef FW_BUILD_WIN
- //----------------------------------------------------------------------------------------
- // FW_SaveFileParameters_WinGetFilterString
- //----------------------------------------------------------------------------------------
- char* SL_API FW_SaveFileParameters_WinGetFilterString(FW_HSaveFileParameters parameters)
- {
- return parameters->fFilterString;
- }
- #endif
-
- #ifdef FW_BUILD_WIN
- //----------------------------------------------------------------------------------------
- // FW_SaveFileParameters_WinGetDefaultExt
- //----------------------------------------------------------------------------------------
- char* SL_API FW_SaveFileParameters_WinGetDefaultExt(FW_HSaveFileParameters parameters)
- {
- return parameters->fDefaultExt;
- }
- #endif
-
- #ifdef FW_BUILD_WIN
- //----------------------------------------------------------------------------------------
- // FW_SaveFileParameters_WinGetDefaultName
- //----------------------------------------------------------------------------------------
- char* SL_API FW_SaveFileParameters_WinGetDefaultName(FW_HSaveFileParameters parameters)
- {
- return parameters->fDefaultName;
- }
- #endif
-
- #ifdef FW_BUILD_WIN
- //----------------------------------------------------------------------------------------
- // FW_SaveFileParameters_WinGetOwnerWindow
- //----------------------------------------------------------------------------------------
- HWND SL_API FW_SaveFileParameters_WinGetOwnerWindow(FW_HSaveFileParameters parameters)
- {
- return parameters->fOwnerWindow;
- }
- #endif
-